package br.com.biavan.modelo;

import java.util.ArrayList;
import java.util.List;

public class Matriz {
	private List<Celula> celulas;	
	private List<String> colunas;
	private List<String> linhas;
	
	public Matriz() {
		this.celulas = new ArrayList<Celula>();
		this.colunas = new ArrayList<String>();
		this.linhas  = new ArrayList<String>();
	}
	
	public void addCelula(Celula celula) {
		this.celulas.add(celula);
	}
	
	public void addColuna(String coluna) {
		this.colunas.add(coluna);
	}
	
	public void addLinha(String linha) {
		this.linhas.add(linha);
	}
	
	public Celula getCelula(int id) {
		return this.celulas.get(id);
	}
	
	public String getColuna(int id) {
		return this.colunas.get(id);
	}
	
	public int getColunasSize() {
		return this.colunas.size();
	}
	
	public List<String> getColunas() {
		return this.colunas;
	}
	
	public String getLinha(int id) {
		return this.linhas.get(id);
	}
	
	public int getLinhasSize() {
		return this.colunas.size();
	}
	
	public List<String> getLinhas() {
		return this.linhas;
	}

	public void dropCelula(Celula drop) {
		int id = -1;
		for (int i = 0; i < this.celulas.size(); i++) {
			Celula celula = this.celulas.get(i); 	
			if (drop.equals(celula)) {
				id = i;
				break;
			}
		}
		if (id != -1) {
			this.celulas.remove(id);
		}
	}
	
	public Celula searchCelula(Celula celula) {
		for (Celula item : this.celulas) {
			if (item.equals(celula)) {
				return item;
			}
		}
		return null;
	}
	
	public Celula seachCelulaPosicao(Posicao posicao) {
		for (Celula celula : this.celulas) {
			if (posicao.equals(celula)) {
				return celula;
			}
		}
		return null;
	}
	
	public void move(Posicao de, Posicao para) {
		Celula celulaDe   = this.seachCelulaPosicao(de);
		Celula celulaPara = this.seachCelulaPosicao(para);
		
		if (celulaDe != null) {
			celulaDe.changeTo(para);
		}
		
		if (celulaPara != null) {
			celulaPara.changeTo(de);
		}
	}

	private void removeCelulas(List<Celula> eliminar) {
		for (Celula item : eliminar) {
			this.dropCelula(item);
		}
	}

	public void reorganizar() {
		this.reorgLinhas();
		this.reorgColunas();
	}
	
	private void reorgLinhas() {
		Celula anterior = null;
		List<Celula> eliminar = new ArrayList<Celula>();
		
		for (String linha : this.linhas) {
			
			for (String coluna : this.colunas) {
				
				Celula c = this.seachCelulaPosicao(new Posicao(coluna, linha));
				
				if (c != null) {
					if ((eliminar.size() == 0 || c.equals(anterior))) {
						eliminar.add(c);
					} else {
						eliminar.clear();
						eliminar.add(c);
					}
				} else if (eliminar.size() < 3){
					eliminar.clear();
				}
				
				anterior = c;
			}

			if (eliminar.size() >= 3) {
				this.removeCelulas(eliminar);
			}
			eliminar.clear();
			anterior = null;
		}	
	}
	
	private void reorgColunas() {
		Celula anterior = null;
		List<Celula> eliminar = new ArrayList<Celula>();
			
		for (String coluna : this.colunas) {
			
			for (String linha : this.linhas) {
				
				Celula c = this.seachCelulaPosicao(new Posicao(coluna, linha));
				
				if (c != null) {
					if ((eliminar.size() == 0 || c.equals(anterior))) {
						eliminar.add(c);
					} else {
						eliminar.clear();
						eliminar.add(c);
					}
				} else if (eliminar.size() < 3){
					eliminar.clear();
				}
				
				anterior = c;
			}

			if (eliminar.size() >= 3) {
				this.removeCelulas(eliminar);
			}
			eliminar.clear();
			anterior = null;
		}	
	}
	
	
	public boolean hasCelulas() {
		return (this.celulas.size() != 0);
	}
}
